package controller

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
	"zhanyan/pac/util"
	"zhanyan/service/classroom_service"
)

// AddClass
// @Summary      添加教室实体
// @Description  添加教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Param        Name   application/x-www-form-urlencoded      string  true  "名字"
// @Param        Type   application/x-www-form-urlencoded      string  true  "类型"
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/addClass [post]
func AddClass(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	Name := c.PostForm("Name")
	Type := c.PostForm("Type")
	classroom := classroom_service.Classroom{Name: Name, Type: Type}
	if err := classroom.Add(); err != nil {
		logE.Errorf("添加教室失败%v", err)
		c.JSON(http.StatusCreated, map[string]interface{}{
			"操作码": err,
		})
		return
	}
	c.JSON(http.StatusOK, map[string]interface{}{
		"操作码": "success",
	})
}

// GetClass
// @Summary      获取教室实体
// @Description  获取教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Param        id   query      int  true  "名字"
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getClass [get]
func GetClass(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	id, _ := strconv.Atoi(c.Query("id"))
	fmt.Println("controller id: ", id)
	classroom := classroom_service.Classroom{ID: id}
	get, err := classroom.Get()
	if err != nil {
		logE.Info("获取教室实体%v", err)
		c.JSON(http.StatusOK, err.Error())
		return
	}
	c.JSON(http.StatusOK, *get)
}

// GetAllClass
// @Summary      获取所有教室实体
// @Description  获取所有教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClass [get]
func GetAllClass(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	classroom := classroom_service.Classroom{}
	get, err := classroom.GetAll()
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, err.Error())
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  *get,
	})
}

// GetAllClassNumber
// @Summary      获取所有教室实体数目
// @Description  获取所有教室实体数目
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassNumber [get]
func GetAllClassNumber(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	classroom := classroom_service.Classroom{}
	get, err := classroom.GetAllNumber()
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, err.Error())
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  get,
	})
}

// GetAllClassPage
// @Summary      分页获取所有教室实体
// @Description  分页获取所有教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Param        page_size   query      int  true  "分页大小"
// @Param        page_code   query      int  true  "页码"
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassPage [get]
func GetAllClassPage(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	classroom := classroom_service.Classroom{}
	ps, _ := strconv.Atoi(c.Query("page_size"))
	pc, _ := strconv.Atoi(c.Query("page_code"))
	get, err := classroom.GetAllPage(ps, pc)
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, err.Error())
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  *get,
	})
}

// GetAllClassByName
// @Summary      根据教室命获取所有教室实体
// @Description  根据教室命获取所有教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassByName [get]
func GetAllClassByName(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	name := c.Query("name")
	classroom := classroom_service.Classroom{Name: name}
	get, err := classroom.GetClassByName()
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  *get,
	})
}

// GetAllClassByNameNumber
// @Summary      根据教室命获取所有教室实体数量
// @Description  根据教室命获取所有教室实体数量
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassByNameNumber [get]
func GetAllClassByNameNumber(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	name := c.Query("name")
	classroom := classroom_service.Classroom{Name: name}
	get, err := classroom.GetClassByNameNumber()
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  get,
	})
}

// GetAllClassPageByName
// @Summary      根据教室名分页获取所有教室实体
// @Description  根据教室名分页获取所有教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Param        page_size   query      int  true  "分页大小"
// @Param        page_code   query      int  true  "页码"
// @Param        name   query      string  true  "名"
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassPageByName [get]
func GetAllClassPageByName(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	name := c.Query("name")
	ps, _ := strconv.Atoi(c.Query("page_size"))
	pc, _ := strconv.Atoi(c.Query("page_code"))
	classroom := classroom_service.Classroom{Name: name}
	get, err := classroom.GetClassByNamePage(ps, pc)
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  *get,
	})
}

// GetAllClassByTidNumber
// @Summary      根据教师id获取所有教室实体数量
// @Description  根据教师id获取所有教室实体数量
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassByTidNumber [get]
func GetAllClassByTidNumber(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	tid, _ := strconv.Atoi(c.Query("teacher_id"))
	classroom := classroom_service.Classroom{TeacherID: tid}
	get, err := classroom.GetClassByTidNum()
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  get,
	})
}

// GetAllClassPageByTid
// @Summary      根据教师id分页获取所有教室实体
// @Description  根据教师id分页获取所有教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Param        page_size   query      int  true  "分页大小"
// @Param        page_code   query      int  true  "页码"
// @Param        name   query      string  true  "名"
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassPageByTid [get]
func GetAllClassPageByTid(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	tid, _ := strconv.Atoi(c.Query("teacher_id"))
	classroom := classroom_service.Classroom{TeacherID: tid}
	ps, _ := strconv.Atoi(c.Query("page_size"))
	pc, _ := strconv.Atoi(c.Query("page_code"))
	get, err := classroom.GetClassByTidPage(ps, pc)
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  *get,
	})
}

// GetAllClassByNameAndTid
// @Summary      根据教室名和教师id获取所有教室实体
// @Description  根据教室名和教师id获取所有教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassByNameAndTid [get]
func GetAllClassByNameAndTid(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	name := c.Query("name")
	tid, _ := strconv.Atoi(c.Query("tid"))
	classroom := classroom_service.Classroom{Name: name, TeacherID: tid}
	get, err := classroom.GetClassByNameAndTid()
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  *get,
	})
}

// GetAllClassPageByNameAndTid
// @Summary      根据教室名和教师id分页获取所有教室实体
// @Description  根据教室名和教师id分页获取所有教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Param        page_size   query      int  true  "分页大小"
// @Param        page_code   query      int  true  "页码"
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassPageByNameAndTid [get]
func GetAllClassPageByNameAndTid(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	name := c.Query("name")
	tid, _ := strconv.Atoi(c.Query("teacher_id"))
	ps, _ := strconv.Atoi(c.Query("page_size"))
	pc, _ := strconv.Atoi(c.Query("page_code"))
	classroom := classroom_service.Classroom{Name: name, TeacherID: tid}
	get, err := classroom.GetClassPageByNameAndTid(ps, pc)
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  *get,
	})
}

// GetAllClassByNameAndTidNum
// @Summary      根据教室名和教师id获取所有教室实体数量
// @Description  根据教室名和教师id获取所有教室实体数量
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/getAllClassByNameAndTidNum [get]
func GetAllClassByNameAndTidNum(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	name := c.Query("name")
	tid, _ := strconv.Atoi(c.Query("teacher_id"))
	classroom := classroom_service.Classroom{Name: name, TeacherID: tid}
	get, err := classroom.GetClassByNameAndTidNumber()
	if err != nil {
		logE.Info("获取所有教室实体%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  get,
	})
}

// UpdateClass
// @Summary      修改教室
// @Description  修改教室实体
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Param        Classroom   json      data  true  "ClassroomJson"
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/updateClass [put]
func UpdateClass(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	classroom := classroom_service.Classroom{}
	err := c.ShouldBindJSON(&classroom)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	if err = classroom.Update(); err != nil {
		logE.Errorf("修改教室失败%v", err)
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusNoContent,
			"msg":  err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  "success",
	})
}

// DeleteClass
// @Summary      删除教室
// @Description  删除教室
// @Tags         classroom
// @Accept       json
// @Produce      json
// @Success      200  {object}  map[string]interface{}
// @Router       /classroom/deleteClass/:id [delete]
func DeleteClass(c *gin.Context) {
	logE, _ := util.GetLogger(util.Errors)
	id, _ := strconv.Atoi(c.Param("id"))
	classroom := classroom_service.Classroom{ID: id}
	if err := classroom.Delete(); err != nil {
		logE.Errorf("删除教室失败%v", err)
		c.JSON(http.StatusOK, err.Error())
		return
	}
	c.JSON(http.StatusOK, map[string]interface{}{
		"msg": "删除成功",
	})
}
